package logger.sd.client;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

import logger.sd.protocol.LRP;

/**
 * LoggerConnector conecta o cliente ao servidor de log
 * 
 * @author wendell
 * 
 */
public class LoggerConnector implements Connector {

	private Socket socket;
	private BufferedReader serverReader;
	private DataOutputStream out;
	
	private static String endl = System.getProperty("line.separator");

	/**
	 * O LoggerConnect precisa conhecer o host e a porta do servidor de log
	 * 
	 * @param host
	 *            hostname do servidor. Ex.: "localhost"
	 * @param port
	 *            porta do servidor. A padrao eh 6789
	 */
	public LoggerConnector(String host, int port) {

		try {
			socket = new Socket(host, port);
			out = new DataOutputStream(socket.getOutputStream());
			serverReader = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Envia uma string ao servidor de log
	 * 
	 * @synchronized
	 * @param message
	 *            Mensagem que sera enviada ao servidor
	 * @exception IOException
	 */
	public synchronized void send(String message) {
		try {
			out.writeBytes(message + endl);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/**
	 * Envia uma mensagem de fim de conexao para o servidor
	 * @return 
	 * 
	 * @synchronized
	 */
	public synchronized String close() {
		send(LRP.END.getMessage());
		String receive = this.receive();
		try {
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return receive;
	}

	/**
	 * Recebe uma mensagem do servidor
	 * 
	 * @synchronized
	 * @return Mensagem recebida do servidor
	 */
	public synchronized String receive() {
		try {
			String msg = serverReader.readLine();
			return msg;
		} catch (IOException e) {
			e.printStackTrace();
			return e.getMessage();
		}
	}

}
